package com.example.wenhua.utils;

import java.math.BigDecimal;
import java.util.regex.Pattern;

/**
 * 数据验证工具类
 */
public class ValidationUtil {
    
    // 学号格式：8位数字
    private static final Pattern SNO_PATTERN = Pattern.compile("^\\d{8}$");
    
    // 课程号格式：字母+数字，如C001
    private static final Pattern CNO_PATTERN = Pattern.compile("^[A-Z]\\d{3}$");
    
    // 用户名格式：字母、数字、下划线，3-20位
    private static final Pattern USERNAME_PATTERN = Pattern.compile("^[a-zA-Z0-9_]{3,20}$");
    
    // 邮箱格式
    private static final Pattern EMAIL_PATTERN = Pattern.compile(
        "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
    );
    
    // 手机号格式
    private static final Pattern PHONE_PATTERN = Pattern.compile("^1[3-9]\\d{9}$");
    
    /**
     * 验证字符串是否为空或null
     */
    public static boolean isEmpty(String str) {
        return str == null || str.trim().isEmpty();
    }
    
    /**
     * 验证字符串是否不为空
     */
    public static boolean isNotEmpty(String str) {
        return !isEmpty(str);
    }
    
    /**
     * 验证学号格式
     */
    public static boolean isValidSno(String sno) {
        return isNotEmpty(sno) && SNO_PATTERN.matcher(sno).matches();
    }
    
    /**
     * 验证课程号格式
     */
    public static boolean isValidCno(String cno) {
        return isNotEmpty(cno) && CNO_PATTERN.matcher(cno).matches();
    }
    
    /**
     * 验证用户名格式
     */
    public static boolean isValidUsername(String username) {
        return isNotEmpty(username) && USERNAME_PATTERN.matcher(username).matches();
    }
    
    /**
     * 验证邮箱格式
     */
    public static boolean isValidEmail(String email) {
        return isNotEmpty(email) && EMAIL_PATTERN.matcher(email).matches();
    }
    
    /**
     * 验证手机号格式
     */
    public static boolean isValidPhone(String phone) {
        return isNotEmpty(phone) && PHONE_PATTERN.matcher(phone).matches();
    }
    
    /**
     * 验证成绩范围（0-100）
     */
    public static boolean isValidGrade(BigDecimal grade) {
        if (grade == null) {
            return false;
        }
        return grade.compareTo(BigDecimal.ZERO) >= 0 && grade.compareTo(new BigDecimal("100")) <= 0;
    }
    
    /**
     * 验证学分范围（0.5-10）
     */
    public static boolean isValidCredit(BigDecimal credit) {
        if (credit == null) {
            return false;
        }
        return credit.compareTo(new BigDecimal("0.5")) >= 0 && credit.compareTo(new BigDecimal("10")) <= 0;
    }
    
    /**
     * 验证年龄范围（16-60）
     */
    public static boolean isValidAge(Integer age) {
        return age != null && age >= 16 && age <= 60;
    }
    
    /**
     * 验证性别（男/女）
     */
    public static boolean isValidGender(String gender) {
        return "男".equals(gender) || "女".equals(gender);
    }
    
    /**
     * 验证用户角色（0-管理员，1-教师，2-学生）
     */
    public static boolean isValidRole(Integer role) {
        return role != null && role >= 0 && role <= 2;
    }
    
    /**
     * 验证字符串长度
     */
    public static boolean isValidLength(String str, int minLength, int maxLength) {
        if (isEmpty(str)) {
            return false;
        }
        int length = str.trim().length();
        return length >= minLength && length <= maxLength;
    }
    
    /**
     * 验证数字范围
     */
    public static boolean isInRange(Number number, Number min, Number max) {
        if (number == null || min == null || max == null) {
            return false;
        }
        double value = number.doubleValue();
        return value >= min.doubleValue() && value <= max.doubleValue();
    }
}